home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Windows marzen / HyperSnap 6.21 / HS6SetPL.exe / [0] / HprSnap6Man.chm / scripts / msdn_ie5.js < prev    next >
Text File  |  2007-08-17  |  29KB  |  1,210 lines

  1. //
  2. // msdn_ie5.js
  3. // Copyright (C) 2003-2004 MGTEK. All rights reserved.
  4. //
  5.  
  6. /////////////////////////////////////////////////////////////////////////////
  7. // Localization strings
  8.  
  9. // Strings for expand-collapse functions
  10. var L_ExpandAll_TEXT = "Expand All";
  11. var L_CollapseAll_TEXT = "Collapse All";
  12. var L_ExColl_TEXT = "Click to Expand or Collapse";
  13.  
  14. // Strings for popup sections
  15. var L_SeeAlso_TEXT = "See Also";
  16. var L_Requirements_TEXT = "Requirements";
  17.  
  18. // Strings for language filtering
  19. var L_FilterTip_TEXT = "Language Filter";
  20. var L_Language_TEXT = "Language";
  21. var L_ShowAll_TEXT = "Show All";
  22.  
  23. // Glossary popups
  24. var L_PopupLinkTitle = "Glossary Term";
  25.  
  26. // End localization
  27. /////////////////////////////////////////////////////////////////////////////
  28.  
  29. var g_DropShadows = new Array;
  30. var g_DropShadowDepth = 4;
  31. var g_DropShadowColor = "gray";
  32.  
  33. /////////////////////////////////////////////////////////////////////////////
  34.  
  35. window.onload = main;
  36.  
  37. function main()
  38. {
  39.     InitializeGlossaryPopup();
  40.     InitializePopupMenu("seealso", L_SeeAlso_TEXT);
  41.     InitializePopupMenu("requirements", L_Requirements_TEXT);
  42.     InitializeLanguages();
  43.     InitializeReftips();
  44.  
  45.     window.onresize = OnBodyResize;
  46.     document.onkeypress = OnBodyKeyPress;
  47.     document.body.onclick = OnBodyClick;
  48.  
  49.     ResetAllButtons();
  50.  
  51.     ResizeBanner();
  52. }
  53.  
  54. function OnBodyResize()
  55. {
  56.     ResizeBanner();
  57.     ResetGUI();
  58. }
  59.  
  60. function OnBodyKeyPress()
  61. {
  62.     if (window.event.keyCode == 27)    // Escape key
  63.         ResetGUI();
  64. }
  65.  
  66. function OnBodyClick()
  67. {
  68.     ResetGUI();
  69. }
  70.  
  71. function ResetGUI()
  72. {
  73.     HideTip();
  74.     HideGlossaryPopup();
  75.     HideAllPopupMenus();
  76.     ResetAllButtons();
  77. }
  78.  
  79. /////////////////////////////////////////////////////////////////////////////
  80. // Non-scrolling Banner
  81. /////////////////////////////////////////////////////////////////////////////
  82.  
  83. function ResizeBanner()
  84. {
  85.     if (document.body.clientWidth == 0)
  86.         return;
  87.  
  88.     var nsbanner = document.all.nsbanner;
  89.     var nstext = document.all.nstext;
  90.     if (!nsbanner || !nstext)
  91.         return;
  92.  
  93.     document.body.scroll = "no"
  94.      nsbanner.style.width = document.body.offsetWidth - 2;
  95.     nstext.style.overflow = "auto";
  96.     nstext.style.width = document.body.offsetWidth - 4;
  97.        nstext.style.height = Math.max(document.body.offsetHeight - (nsbanner.offsetHeight + 4), 0);
  98.  
  99.     try
  100.     {
  101.         nstext.setActive();
  102.     }
  103.     catch(e)
  104.     {
  105.     }
  106. }
  107.  
  108. /////////////////////////////////////////////////////////////////////////////
  109. // Common popup menu code
  110. /////////////////////////////////////////////////////////////////////////////
  111.  
  112. var g_PopupMenus = new Array;
  113.  
  114. function InsertButtonAndPopupMenu(id, name, div)
  115. {
  116.     var id = id;
  117.     var td = hdr.insertCell(g_PopupMenus.length);
  118.     if (td)
  119.     {
  120.         td.className = "button";
  121.         td.onclick = ShowPopupMenu;
  122.         td.onkeypress = ShowPopupMenu;
  123.         td.onkeyup = OnBodyKeyPress;
  124.         td.innerHTML = '<IMG id="button" popupid="' + id + '" src="' + jsPath + id + '1.gif' + '" alt="' + name + '" border=0 tabindex=0>';
  125.         nsbanner.insertAdjacentHTML('afterEnd', div);
  126.         g_PopupMenus[g_PopupMenus.length] = id;
  127.     }
  128. }
  129.  
  130. function ShowPopupMenu()
  131. {
  132.     window.event.returnValue = false;
  133.     window.event.cancelBubble = true;
  134.  
  135.     ResetGUI();
  136.  
  137.     var source = window.event.srcElement;
  138.  
  139.     var id = source.popupid;
  140.     if (id)
  141.     {
  142.         source.src = source.src.replace("1.gif", "2.gif");
  143.  
  144.         var div = document.all[id];
  145.         if (div)
  146.         {
  147.             div.style.pixelTop = source.offsetTop + source.offsetHeight;
  148.             div.style.visibility = "visible";
  149.             CreateDropShadow(div);
  150.         }
  151.     }
  152. }
  153.  
  154. function HideAllPopupMenus()
  155. {
  156.     for (var i = 0; i < g_PopupMenus.length; i++)
  157.     {
  158.         var id = g_PopupMenus[i];
  159.         var div = document.all.item(id);
  160.         if (div)
  161.         {
  162.             div.style.visibility = "hidden";
  163.             RemoveDropShadow();
  164.         }
  165.     }
  166. }
  167.  
  168. function ResetAllButtons()
  169. {
  170.     var buttons = document.all.button;
  171.     if (buttons)
  172.     {
  173.         if (buttons.src)
  174.         {
  175.             buttons.src = buttons.src.replace("2.gif", "1.gif");
  176.         }
  177.         else
  178.         {
  179.             for (var i = 0; i < buttons.length; i++)
  180.                 buttons[i].src = buttons[i].src.replace("2.gif", "1.gif");
  181.         }
  182.     }
  183. }
  184.  
  185. /////////////////////////////////////////////////////////////////////////////
  186. // "See Also" and "Requirements" Popup Menus
  187. /////////////////////////////////////////////////////////////////////////////
  188.  
  189. function InitializePopupMenu(id, name)
  190. {
  191.     var hdr = document.all.hdr;
  192.     if (!hdr)
  193.         return;
  194.  
  195.     var text = "";
  196.  
  197.     // Get the content for the popup window.
  198.     var headings = document.all.tags("H4");
  199.     for (var i = 0; i < headings.length; i++)
  200.     {
  201.         var heading = headings[i];
  202.  
  203.         // Find H4 elements that match 'name'.
  204.         if (BeginsWith(heading.innerText, name))
  205.         {
  206.             // Found one. Get elements until we hit the next heading element.
  207.             text += heading.outerHTML;
  208.             var e = heading.nextSibling;
  209.             while (e && !e.tagName.match(/^(H[1-4])|(DIV)$/))
  210.             {
  211.                 text += e.outerHTML;
  212.                 e = e.nextSibling;
  213.             }
  214.         }
  215.     }
  216.  
  217.     // Create the popup DIV.
  218.     if (text != "")
  219.     {
  220.         var div = '<DIV id="' + id + '" class="popup" onkeypress="OnBodyKeyPress">' + text + '</DIV>';
  221.         InsertButtonAndPopupMenu(id, name, div);
  222.     }
  223. }
  224.  
  225. /////////////////////////////////////////////////////////////////////////////
  226. // Glossary Popups
  227. /////////////////////////////////////////////////////////////////////////////
  228.  
  229. var g_PopupStyle = "width: 50%; padding: 5px 8px; background: #ffffcc; border: solid 1px #999999;";
  230. var g_PopupLinkStyle = "cursor: hand; color: green; text-decoration: underline;";
  231.  
  232. function InitializeGlossaryPopup()
  233. {
  234.     if (document.all.glossarypopuplink)
  235.     {
  236.         var html = '';
  237.  
  238.         html += '<OBJECT id="oGlossary" classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83" style="display:none; position:absolute;">\n';
  239.         html += '\t<PARAM name="DataURL" value="glossary.csv">\n';
  240.         html += '\t<PARAM name="UseHeader" value="True">\n';
  241.         html += '\t<PARAM name="TextQualifier" value="|">\n';
  242.         html += '</OBJECT>\n';
  243.  
  244.         html += '<SCR' + 'IPT language="javascript" for="glossarypopuplink" event="onmouseover">\n';
  245.         html += '\tthis.title = "' + L_PopupLinkTitle + '";';
  246.         html += '</SCR' + 'IPT>\n';
  247.         html += '<SCR' + 'IPT language="javascript" for="glossarypopuplink" event="onclick">\n';
  248.         html += '\tShowGlossaryPopup();\n';
  249.         html += '</SCR' + 'IPT>\n';
  250.  
  251.         html += '<DIV id="glossarypopup" class="glossarypopup"></DIV>\n';
  252.  
  253.         nsbanner.insertAdjacentHTML("afterEnd", html);
  254.     }
  255. }
  256.  
  257. function ShowGlossaryPopup()
  258. {
  259.     window.event.returnValue = false;
  260.     window.event.cancelBubble = true;
  261.     
  262.     ResetGUI();
  263.  
  264.     var div = document.all.glossarypopup;
  265.     if (div)
  266.     {
  267.         var e = window.event.srcElement;
  268.         var index = e.href.lastIndexOf("#");
  269.         if (index >= 0)
  270.         {
  271.             var key = e.href.substr(index + 1);
  272.             var item = GetGlossaryItem(key);
  273.             if (item.Found)
  274.             {
  275.                 div.innerHTML = '<H4>' + item.Term + '</H4><P>' + item.Definition + '</P>';
  276.                 var bodyWidth = document.body.clientWidth - g_DropShadowDepth;
  277.                 var bodyHeight = document.body.clientHeight - g_DropShadowDepth;
  278.                 var x = window.event.clientX;
  279.                 var y = window.event.clientY;
  280.                 var width = div.offsetWidth;
  281.                 var height = div.offsetHeight;
  282.                 if (x + width > bodyWidth && width < bodyWidth)
  283.                     x = bodyWidth - width;
  284.                 if (y + height > bodyHeight && height < bodyHeight)
  285.                     y = bodyHeight - height;
  286.                 div.style.left = x + document.body.scrollLeft;
  287.                 div.style.top = y + document.body.scrollTop;
  288.                 div.style.visibility = "visible";
  289.                 CreateDropShadow(div);
  290.             }
  291.         }
  292.     }
  293. }
  294.  
  295. function HideGlossaryPopup()
  296. {
  297.     var div = document.all.glossarypopup;
  298.     if (div)
  299.     {
  300.         div.style.visibility = "hidden";
  301.         RemoveDropShadow();
  302.     }
  303. }
  304.  
  305. function GetGlossaryItem(key)
  306. {
  307.     var item = new GlossaryItem();
  308.     oGlossary.Filter = "key=" + key;
  309.     oGlossary.Reset();
  310.     
  311.     var recordset = oGlossary.recordset;
  312.     if (recordset.RecordCount > 0)
  313.     {
  314.         recordset.MoveFirst();
  315.         item.Term = recordset.fields.item("term").value;
  316.         item.Definition = recordset.fields.item("definition").value;
  317.         item.Found = true;
  318.     }
  319.     return item;
  320. }
  321.  
  322. function GlossaryItem()
  323. {
  324.     this.Term = "";
  325.     this.Definition = "";
  326.     this.Found = false;
  327. }
  328.  
  329. /////////////////////////////////////////////////////////////////////////////
  330. // Expandable/Collapsable sections
  331. /////////////////////////////////////////////////////////////////////////////
  332.  
  333. function makeExpandable(title, level)
  334. {
  335.     if (title != "")
  336.     {
  337.         var code = '<A href="#" id="expand" class="expandlink' + level + '" onclick="ToggleSection()">';
  338.         code += '<IMG class="expand" src="' + jsPath + 'expand.gif" width="9" height="9" border="0" alt="' + L_ExColl_TEXT + '">';
  339.         code += ' ' + title;
  340.         code += '</A>';
  341.         code += '<BR><DIV class="expandbody">';
  342.         document.write(code);
  343.     }
  344.     else
  345.     {
  346.         var code = '<A href="#" id="expandall" onclick="ExpandAllSections()" class="expandlink' + level + '">';
  347.         code += '<IMG class="expandall" src="' + jsPath + 'expand.gif" width="9" height="9" border="0" alt="' + L_ExColl_TEXT + '">';
  348.         code += ' ' + L_ExpandAll_TEXT;
  349.         code += '</A>';
  350.         document.write(code);
  351.     }
  352. }
  353.  
  354. function ToggleSection()
  355. {
  356.     event.returnValue = false;
  357.  
  358.     var link = GetExpandCollapseLink(window.event.srcElement);
  359.     var div = GetExpandCollapseDiv(link);
  360.     var img = GetExpandCollapseImage(link);
  361.  
  362.     if (div.style.display == "block")
  363.     {
  364.         img.src = jsPath + "expand.gif";
  365.         div.style.display = "none";
  366.     }
  367.     else
  368.     {
  369.         img.src = jsPath + "collapse.gif";
  370.         div.style.display = "block";
  371.     }
  372. }
  373.  
  374. function ExpandAllSections()
  375. {
  376.     event.returnValue = false;
  377.  
  378.     var link = GetExpandCollapseLink(window.event.srcElement);
  379.  
  380.     var expandAll = link.innerHTML.indexOf(L_ExpandAll_TEXT) != -1;
  381.     if (expandAll)
  382.     {
  383.         var code = '<IMG class="expandall" src="' + jsPath + 'collapse.gif" width="9" height="9" border="0" alt="' + L_ExColl_TEXT + '">';
  384.         code += ' ' + L_CollapseAll_TEXT;
  385.         link.innerHTML = code;
  386.     }
  387.     else
  388.     {
  389.         var code = '<IMG class="expandall" src="' + jsPath + 'expand.gif" width="9" height="9" border="0" alt="' + L_ExColl_TEXT + '">';
  390.         code += ' ' + L_ExpandAll_TEXT;
  391.         link.innerHTML = code;
  392.     }
  393.  
  394.     var links = document.links;
  395.     for (var i = 0; i < links.length; i++)
  396.     {
  397.         var link = links(i);
  398.  
  399.         if (link.id == "expand")
  400.         {
  401.             var div = GetExpandCollapseDiv(link);
  402.             var img = GetExpandCollapseImage(link);
  403.             if (expandAll)
  404.             {
  405.                 img.src = jsPath + "collapse.gif";
  406.                 div.style.display = "block";
  407.             }
  408.             else
  409.             {
  410.                 img.src = jsPath + "expand.gif";
  411.                 div.style.display = "none";
  412.             }
  413.         }
  414.     }
  415. }
  416.  
  417. function GetExpandCollapseLink(e)
  418. {
  419.     while (e.tagName != "A")
  420.         e = e.parentElement;
  421.     return e;
  422. }
  423.  
  424. function GetExpandCollapseImage(e)
  425. {
  426.     return e.all.tags("IMG")(0);
  427. }
  428.  
  429. function GetExpandCollapseDiv(e)
  430. {
  431.     while (e)
  432.     {
  433.         if (e.tagName == "DIV" && e.className.toLowerCase() == "expandbody")
  434.             return e;
  435.         e = e.nextSibling;
  436.     }
  437.     return null;
  438. }
  439.  
  440. /////////////////////////////////////////////////////////////////////////////
  441. // Language filtering
  442. /////////////////////////////////////////////////////////////////////////////
  443.  
  444. function InitializeLanguages()
  445. {
  446.     var hdr = document.all.hdr;
  447.     if (!hdr)
  448.         return;
  449.  
  450.     var languages = EnumerateLanguages();
  451.     if (languages.length == 0)
  452.         return;
  453.  
  454.     var language = DetermineLanguage();
  455.     if (language == null)
  456.         language = GetLanguageFromCookie(languages);
  457.  
  458.     var pres = document.all.tags("PRE");
  459.     if (pres)
  460.     {
  461.         for (var i = 0; i < pres.length; i++)
  462.             InitializePreElement(pres[i]);
  463.     }
  464.  
  465.     // Create language indicator.
  466.     var head = document.all.tags("H1")[0];
  467.     head.insertAdjacentHTML('beforeEnd', '<SPAN class="ilang"></SPAN>');
  468.  
  469.     var id = "language";
  470.     var div = '<DIV id="' + id + '" class="language" onkeypress="OnBodyKeyPress"><B>' + L_Language_TEXT + '</B><UL>';
  471.     for (var i = 0; i < languages.length; i++)
  472.         div += '<LI><A href="#" onclick="SelectLanguage(this)">' + languages[i] + '</A><BR>';
  473.     div += '<LI><A href="" onclick="SelectAllLanguages()">' + L_ShowAll_TEXT + '</A></UL></DIV>';
  474.     InsertButtonAndPopupMenu(id, L_FilterTip_TEXT, div);
  475.  
  476.     if (language != null)
  477.         FilterLanguages();
  478. }
  479.  
  480. function SelectLanguage(item)
  481. {
  482.     window.event.returnValue = false;
  483.     window.event.cancelBubble = true;
  484.  
  485.     ResetGUI();
  486.  
  487.     if (item)
  488.     {
  489.         var language = item.innerText;
  490.         StoreLanguageInCookie(language);
  491.         FilterLanguages(language);
  492.     }
  493. }
  494.  
  495. function SelectAllLanguages()
  496. {
  497.     window.event.returnValue = false;
  498.     window.event.cancelBubble = true;
  499.  
  500.     ResetGUI();
  501.  
  502.     StoreLanguageInCookie(null);
  503.     UnfilterLanguages();
  504. }
  505.  
  506. function FilterLanguages(language)
  507. {
  508.     var spans = document.all.tags("SPAN");
  509.     for (var i = 0; i < spans.length; i++)
  510.     {
  511.         var e = spans[i];
  512.         if (e.className == "lang")
  513.         {
  514.             var newVal = FilterMatch(e.innerText, language) ? "block" : "none";
  515.             var block = GetBlockElement(e);
  516.             block.style.display = newVal;
  517.             e.style.display = "none";
  518.  
  519.             if (block.tagName == "DT")
  520.             {
  521.                 var next = block.nextSibling;
  522.                 if (next && next.tagName == "DD")
  523.                     next.style.display = newVal;
  524.             }
  525.             else if (block.tagName == "DIV")
  526.             {
  527.                 block.className = "filtered2";
  528.             }
  529.             else if (block.tagName.match(/^H[1-6]$/))
  530.             {
  531.                 if (IsTopicHeading(block))
  532.                 {
  533.                     if (newVal != "none")
  534.                     {
  535.                         var tag = null;
  536.                         if (block.children && block.children.length)
  537.                         {
  538.                             tag = block.children[block.children.length - 1];
  539.                             if (tag.className == "ilang")
  540.                             {
  541.                                 tag.innerHTML = (newVal == "block") ?
  542.                                     '  [' + language + ']' : "";
  543.                             }
  544.                         }
  545.                     }
  546.                 }
  547.                 else
  548.                 {
  549.                     var next = block.nextSibling;
  550.                     while (next && !next.tagName.match(/^(H[1-6])$/))
  551.                     {
  552.                         if (next.tagName =="DIV")
  553.                         {
  554.                             if (next.className.toUpperCase() != "TABLEDIV") break;
  555.                         }
  556.                         next.style.display = newVal;
  557.                         next = next.nextSibling;
  558.                     }
  559.                 }
  560.             }
  561.         }
  562.         else if (e.className == "ilang")
  563.         {
  564.             var block = GetBlockElement(e);
  565.             if (block.tagName == "H1")
  566.                 e.innerHTML = '  [' + language + ']';
  567.         }
  568.     }
  569.     ResizeBanner();
  570. }
  571.  
  572. function UnfilterLanguages()
  573. {
  574.     var spans = document.all.tags("SPAN");
  575.     for (var i = 0; i < spans.length; i++)
  576.     {
  577.         var e = spans[i];
  578.         if (e.className == "lang")
  579.         {
  580.             var block = GetBlockElement(e);
  581.             block.style.display = "block";
  582.             e.style.display = "inline";
  583.  
  584.             if (block.tagName == "DT") {
  585.                 var next = block.nextSibling;
  586.                 if (next && next.tagName == "DD")
  587.                     next.style.display = "block";
  588.             }
  589.             else if (block.tagName == "DIV")
  590.             {
  591.                 block.className = "filtered";
  592.             }
  593.             else if (block.tagName.match(/^H[1-6]$/))
  594.             {
  595.                 if (IsTopicHeading(block))
  596.                 {
  597.                     var tag = null;
  598.                     if (block.children && block.children.length)
  599.                     {
  600.                         tag = block.children[block.children.length - 1];
  601.                         if (tag && tag.className == "ilang")
  602.                             tag.innerHTML = "";
  603.                     }
  604.                 }
  605.                 else
  606.                 {
  607.                     var next = block.nextSibling;
  608.                     while (next && !next.tagName.match(/^(H[1-6])$/))
  609.                     {
  610.                         if (next.tagName =="DIV")
  611.                         {
  612.                             if (next.className.toUpperCase() != "TABLEDIV")
  613.                                 break;
  614.                         }
  615.                         next.style.display = "block";
  616.                         next = next.nextSibling;
  617.                     }
  618.                 }
  619.             }
  620.         }
  621.         else if (e.className == "ilang")
  622.         {
  623.             e.innerHTML = "";
  624.         }
  625.     }
  626.     ResizeBanner();
  627. }
  628.  
  629. function InitializePreElement(pre)
  630. {
  631.     var htm0 = pre.outerHTML;
  632.  
  633.     var reLang = /<span\b[^>]*class="?lang"?[^>]*>/i;
  634.     var first = -1;
  635.     var second = -1;
  636.  
  637.     first = htm0.search(reLang);
  638.     if (first >= 0)
  639.     {
  640.         iPos = first + 17;
  641.         iMatch = htm0.substr(iPos).search(reLang);
  642.         if (iMatch >= 0)
  643.             second = iPos + iMatch;
  644.     }
  645.  
  646.     if (second < 0)
  647.     {
  648.         var htm1 = TrimPreElement(htm0);
  649.         if (htm1 != htm0)
  650.         {
  651.             pre.insertAdjacentHTML('afterEnd', htm1);
  652.             pre.outerHTML = "";
  653.         }
  654.     }
  655.     else
  656.     {
  657.         var rePairs = /<(\w+)\b[^>]*><\/\1>/gi;
  658.  
  659.         var substr1 = htm0.substring(0, second);
  660.         var tags1 = substr1.replace(/>[^<>]+(<|$)/g, ">$1");
  661.         var open1 = tags1.replace(rePairs, "");
  662.         open1 = open1.replace(rePairs, "");
  663.  
  664.         var substr2 = htm0.substring(second);
  665.         var tags2 = substr2.replace(/>[^<>]+</g, "><");
  666.         var open2 = tags2.replace(rePairs, "");
  667.         open2 = open2.replace(rePairs, "");
  668.  
  669.         pre.insertAdjacentHTML('afterEnd', open1 + substr2);
  670.         pre.insertAdjacentHTML('afterEnd', TrimPreElement(substr1 + open2));
  671.         pre.outerHTML = "";
  672.     }
  673. }
  674.  
  675. function TrimPreElement(html)
  676. {
  677.     return html.replace(/[ \r\n]*((<\/[BI]>)*)[ \r\n]*<\/PRE>/g, "$1</PRE>").replace(/\w*<\/SPAN>\w*((<[BI]>)*)\r\n/g, "\r\n</SPAN>$1");
  678. }
  679.  
  680. function GetBlockElement(e)
  681. {
  682.     while (e && e.tagName.match(/^([BIUA]|(SPAN)|(CODE)|(TD))$/))
  683.         e = e.parentElement;
  684.     return e;
  685. }
  686.  
  687. function IsTopicHeading(head)
  688. {
  689.     for (var i = 0; i < nstext.children.length; i++)
  690.     {
  691.         var e = nstext.children[i];
  692.         if (e.sourceIndex < head.sourceIndex)
  693.         {
  694.             if (e.tagName.match(/^(P)|(PRE)|([DOU]L)$/))
  695.                 return false;
  696.         }
  697.         else
  698.         {
  699.             break;
  700.         }
  701.     }
  702.     return true;
  703. }
  704.  
  705. function FilterMatch(text, name)
  706. {
  707.     var a = text.split(",");
  708.     for (var iTok = 0; iTok < a.length; iTok++)
  709.     {
  710.         var m = a[iTok].match(/([A-Za-z].*[A-Za-z+#0-9])/);
  711.         if (m && m[1] == name)
  712.             return true;
  713.     }
  714.     return false;
  715. }
  716.  
  717. function GetLanguageFromCookie(languages)
  718. {
  719.     var obj = document.all.obj_cook;
  720.     if (obj && obj.object)
  721.     {
  722.         if (obj.getValue("lang.all") != "1")
  723.         {
  724.             var lang = obj.getValue("lang");
  725.             var c = languages.length;
  726.             for (var i = 0; i != c; ++i)
  727.             {
  728.                 if (languages[i] == lang)
  729.                     return lang;
  730.             }
  731.         }
  732.     }
  733.     return null;
  734. }
  735.  
  736. function StoreLanguageInCookie(language)
  737. {
  738.     var obj = document.all.obj_cook;
  739.     if (obj && obj.object)
  740.     {
  741.         if (language == null)
  742.         {
  743.             obj.putValue('lang.all', '1');
  744.         }
  745.         else
  746.         {
  747.             obj.putValue('lang', language);
  748.             obj.putValue('lang.all', '');
  749.         }
  750.     }
  751. }
  752.  
  753. function EnumerateLanguages()
  754. {
  755.     var languages = new Array;
  756.  
  757.     var spans = document.all.tags("SPAN");
  758.     for (var i = 0; i < spans.length; i++)
  759.     {
  760.         var span = spans[i];
  761.         if (span.className == "lang")
  762.         {
  763.             var tokens = span.innerText.split(",");
  764.             for (var t = 0; t < tokens.length; t++)
  765.             {
  766.                 var token = tokens[t];
  767.                 var id = token.match(/([A-Za-z].*[A-Za-z+#0-9]+)/);
  768.                 if (id && !IsArrayElement(languages, id[1]))
  769.                     languages[languages.length] = id[1];
  770.             }
  771.         }
  772.     }
  773.     languages.sort();
  774.     return languages;
  775. }
  776.  
  777. function DetermineLanguage()
  778. {
  779.     try
  780.     {
  781.         for (var i = 1; i < window.external.ContextAttributes.Count; i++)
  782.         {
  783.             if (window.external.ContextAttributes(i).Name.toUpperCase()=="DEVLANG")
  784.             {
  785.                 var attributes = window.external.ContextAttributes(i).Values.toArray();
  786.                 var language = attributes[0].toUpperCase();
  787.                 if (language != null)
  788.                 {
  789.                     if (language.indexOf("VB")!=-1)
  790.                         return "Visual Basic";
  791.                     if (language.indexOf("VC")!=-1)
  792.                         return "C++";
  793.                     if (language.indexOf("CSHARP")!=-1)
  794.                         return "C#";
  795.                 }
  796.             }
  797.         }
  798.     }
  799.     catch(e)
  800.     {
  801.     }
  802.  
  803.     try
  804.     {
  805.         var language = window.external.Help.FilterQuery.toUpperCase();
  806.         if (language.indexOf("VISUAL BASIC") !=- 1)
  807.             return "Visual Basic";
  808.         if (language.indexOf("VISUAL C++") !=- 1)
  809.             return "C++";
  810.         if (language.indexOf("C#") != -1)
  811.             return "C#";
  812.     }
  813.     catch(e)
  814.     {
  815.     }
  816.  
  817.     return null;
  818. }
  819.  
  820. /////////////////////////////////////////////////////////////////////////////
  821. // Reftips (parameter popups)
  822. /////////////////////////////////////////////////////////////////////////////
  823.  
  824. function InitializeReftips()
  825. {
  826.     var pres = document.all.tags("PRE");
  827.     var dls = document.all.tags("DL");
  828.     if (!pres || !dls)
  829.         return;
  830.  
  831.     var list = 0;
  832.  
  833.     var lastTip = -1;
  834.     for (var i = 0; i < pres.length; i++)
  835.     {
  836.         var pre = pres[i];
  837.         if (pre.className == "syntax")
  838.         {
  839.             while (list < dls.length && dls[list].sourceIndex < pre.sourceIndex)
  840.                 list++;
  841.             if (list >= dls.length)
  842.                 break;
  843.  
  844.             InitializeSyntaxTip(pre, dls[list]);
  845.             lastTip = i;
  846.         }
  847.     }
  848.  
  849.     if (lastTip >= 0)
  850.     {
  851.         var last = pres[lastTip];
  852.         if (last.parentElement.tagName == "DIV")
  853.             last = last.parentElement;
  854.         last.insertAdjacentHTML('afterEnd', '<DIV id="reftip" class="reftip" style="position:absolute;visibility:hidden;overflow:visible;"></DIV>');
  855.     }
  856. }
  857.  
  858. function InitializeSyntaxTip(pre, dl)
  859. {
  860.     var syntax = pre.outerHTML;
  861.  
  862.     var ichStart = syntax.indexOf('>', 0) + 1;
  863.  
  864.     var terms = dl.children.tags("DT");
  865.     if (terms)
  866.     {
  867.         for (var i = 0; i < terms.length; i++)
  868.         {
  869.             var term = terms[i];
  870.             var html = term.innerHTML;
  871.  
  872.             var words = term.innerText.replace(/\[.+\]/g, " ").replace(/,/g, " ").split(" ");
  873.             for (var iWord = 0; iWord < words.length; iWord++)
  874.             {
  875.                 var word = words[iWord];
  876.  
  877.                 if (word.length > 0 && html.indexOf(word, 0) < 0)
  878.                     word = word.replace(/:.+/, "");
  879.  
  880.                 if (word.length > 0)
  881.                 {
  882.                     var matchPos = FindTerm(syntax, ichStart, word);
  883.                     while (matchPos > 0)
  884.                     {
  885.                         if (!IsLinkText(syntax.substring(matchPos)))
  886.                         {
  887.                             var tag = '<A href="" onclick="ShowTip(this)" class="synParam">' + word + '</A>';
  888.                             syntax = syntax.slice(0, matchPos) + tag + syntax.slice(matchPos + word.length);
  889.                             matchPos = FindTerm(syntax, matchPos + tag.length, word);
  890.                         }
  891.                         else
  892.                         {
  893.                             matchPos = FindTerm(syntax, matchPos + word.length, word);
  894.                         }
  895.                     }
  896.                 }
  897.             }
  898.         }
  899.     }
  900.  
  901.     pre.outerHTML = syntax;
  902. }
  903. function ShowTip(link)
  904. {
  905.     window.event.returnValue = false;
  906.     window.event.cancelBubble = true;
  907.  
  908.     ResetGUI();
  909.  
  910.     var tip = document.all.reftip;
  911.     if (!tip || !link)
  912.         return;
  913.  
  914.     tip.style.visibility = "hidden";
  915.     tip.style.pixelWidth = 260;
  916.     tip.style.pixelHeight = 24;
  917.  
  918.     var term = null;
  919.     var definition = null;
  920.  
  921.     var dls = document.all.tags("DL");
  922.     for (var i = 0; i < dls.length; i++)
  923.     {
  924.         var dl = dls[i];
  925.         if (dl.sourceIndex > link.sourceIndex)
  926.         {
  927.             var iMax = dl.children.length - 1;
  928.             for (var iElem = 0; iElem < iMax; iElem++)
  929.             {
  930.                 var dt = dl.children[iElem];
  931.                 if (dt.tagName == "DT" && dt.style.display != "none")
  932.                 {
  933.                     if (FindTerm(dt.innerText, 0, link.innerText) >= 0)
  934.                     {
  935.                         var dd = dl.children[iElem + 1];
  936.                         if (dd.tagName == "DD")
  937.                         {
  938.                             term = dt;
  939.                             definition = dd;
  940.                         }
  941.                         break;
  942.                     }
  943.                 }
  944.             }
  945.             break;
  946.         }
  947.     }
  948.  
  949.     if (definition)
  950.     {
  951.         window.linkElement = link;
  952.         window.linkTarget = term;
  953.         tip.innerHTML = '<DL><DT>' + term.innerHTML + '</DT><DD>' + definition.innerHTML + '</DD></DL>';
  954.         window.setTimeout("MoveTip()", 0);
  955.     }
  956. }
  957.  
  958. function MoveTip()
  959. {
  960.     var tip = document.all.reftip;
  961.     var link = window.linkElement;
  962.     if (!tip || !link)
  963.         return;
  964.  
  965.     var w = tip.offsetWidth;
  966.     var h = tip.offsetHeight;
  967.  
  968.     if (w > tip.style.pixelWidth)
  969.     {
  970.         tip.style.pixelWidth = w;
  971.         window.setTimeout("MoveTip()", 0);
  972.         return;
  973.     }
  974.  
  975.     var maxw = document.body.clientWidth - 20;
  976.     var maxh = document.body.clientHeight - 200;
  977.  
  978.     if (h > maxh)
  979.     {
  980.         if (w < maxw)
  981.         {
  982.             w = w * 3 / 2;
  983.             tip.style.pixelWidth = (w < maxw) ? w : maxw;
  984.             window.setTimeout("MoveTip()", 0);
  985.             return;
  986.         }
  987.     }
  988.  
  989.     var x, y;
  990.  
  991.     var linkLeft = link.offsetLeft - document.body.scrollLeft;
  992.     var linkRight = linkLeft + link.offsetWidth;
  993.  
  994.     try
  995.     {
  996.         var linkTop = link.offsetTop - nstext.scrollTop + nstext.offsetTop;
  997.     }
  998.     catch(e)
  999.     {
  1000.         var linkTop = link.offsetTop;
  1001.     }
  1002.  
  1003.     var linkBottom = linkTop + link.offsetHeight + 4;
  1004.  
  1005.     var cxMin = link.offsetWidth - 24;
  1006.     if (cxMin < 16)
  1007.         cxMin = 16;
  1008.  
  1009.     if ((linkLeft + cxMin + w <= maxw) && (h+linkTop <= maxh + 150))
  1010.     {
  1011.         x = linkLeft;
  1012.         y = linkBottom;
  1013.     }
  1014.     if ((linkLeft + cxMin + w <= maxw) && (h+linkTop > maxh + 150))
  1015.     {
  1016.         x = maxw - w;
  1017.         if (x > linkRight + 8)
  1018.             x = linkRight + 8;
  1019.         x = linkLeft;
  1020.         y = linkTop-h;
  1021.     }
  1022.     if ((linkLeft + cxMin + w >= maxw) && (h+linkTop <= maxh + 150))
  1023.     {
  1024.         x = linkRight - w;
  1025.         if (x < 0)
  1026.             x = 0;
  1027.         y = linkBottom;
  1028.     }
  1029.     if ((linkLeft + cxMin + w >= maxw) && (h+linkTop > maxh + 150))
  1030.     {
  1031.         x = linkRight - w;
  1032.         if (x < 0)
  1033.             x = 0;
  1034.         y = linkTop - h;
  1035.         if (y < 0)
  1036.             y = 0;
  1037.     }
  1038.     link.style.background = "#CCCCCC";
  1039.     tip.style.pixelLeft = x + document.body.scrollLeft;
  1040.     tip.style.pixelTop = y;
  1041.     tip.style.visibility = "visible";
  1042.     CreateDropShadow(tip);
  1043. }
  1044.  
  1045. function HideTip()
  1046. {
  1047.     var tip = document.all.reftip;
  1048.     var link = window.linkElement;
  1049.     if (!tip || !link)
  1050.         return;
  1051.  
  1052.     window.linkElement.style.background = "";
  1053.     window.linkElement = null;
  1054.  
  1055.     tip.style.visibility = "hidden";
  1056.     tip.innerHTML = "";
  1057.     RemoveDropShadow();
  1058. }
  1059.  
  1060. function FindTerm(syntax, pos, term)
  1061. {
  1062.     var matchPos = syntax.indexOf(term, pos);
  1063.     while (matchPos >= 0)
  1064.     {
  1065.         var prev = (matchPos == 0) ? '\0' : syntax.charAt(matchPos - 1);
  1066.         var next = syntax.charAt(matchPos + term.length);
  1067.         if (!isalnum(prev) && !isalnum(next) && !IsInTag(syntax, matchPos))
  1068.         {
  1069.             var commentPos = syntax.indexOf("/*", pos);
  1070.             while (commentPos >= 0)
  1071.             {
  1072.                 if (commentPos > matchPos)
  1073.                 {
  1074.                     commentPos = -1;
  1075.                     break;
  1076.                 }
  1077.                 var ichEnd = syntax.indexOf("*/", commentPos);
  1078.                 if (ichEnd < 0 || ichEnd > matchPos)
  1079.                     break;
  1080.                 commentPos = syntax.indexOf("/*", ichEnd);
  1081.             }
  1082.             if (commentPos < 0)
  1083.             {
  1084.                 commentPos = syntax.indexOf("//", pos);
  1085.                 var newPos = 0;
  1086.                 if (commentPos >= 0)
  1087.                 {
  1088.                     while (IsInTag(syntax, commentPos))
  1089.                     {
  1090.                         newPos = commentPos + 1;
  1091.                         commentPos = syntax.indexOf("//", newPos);
  1092.                         if (commentPos < 0)
  1093.                             break;
  1094.                     }
  1095.                     while (commentPos >= 0)
  1096.                     {
  1097.                         if (commentPos > matchPos)
  1098.                         {
  1099.                             commentPos = -1;
  1100.                             break;
  1101.                         }
  1102.                         var ichEnd = syntax.indexOf("\n", commentPos);
  1103.                         if (ichEnd < 0 || ichEnd > matchPos)
  1104.                             break;
  1105.                         commentPos = syntax.indexOf("//", ichEnd);
  1106.                     }
  1107.                 }
  1108.             }
  1109.             if (commentPos < 0)
  1110.                 break;
  1111.         }
  1112.         matchPos = syntax.indexOf(term, matchPos + term.length);
  1113.     }
  1114.     return matchPos;
  1115. }
  1116.  
  1117. function IsLinkText(html)
  1118. {
  1119.     return html.indexOf("<") == html.toLowerCase().indexOf("<\/a>");
  1120. }
  1121.  
  1122. function IsInTag(html, pos)
  1123. {
  1124.     return html.lastIndexOf('<', pos) > html.lastIndexOf('>', pos);
  1125. }
  1126.  
  1127. /////////////////////////////////////////////////////////////////////////////
  1128. // Feedback links
  1129. /////////////////////////////////////////////////////////////////////////////
  1130.  
  1131. function sendfeedback(id, alias)
  1132. {
  1133.     var url = location.href;
  1134.     var title = document.all.tags("TITLE")(0).innerText;
  1135.     var browser = navigator.appName + " " + navigator.appVersion
  1136.     var href = "mailto:" + alias + "?subject=" + id + "%20" + title + "&body=Topic%20ID:%20" + id + "%0d%0a";
  1137.     href += "Topic%20Title:%20" + title + "%0d%0a";
  1138.     href += "URL:%20" + url + "%0d%0a";
  1139.     href += "Browser:%20" + browser + "%0d%0a%0d%0a";
  1140.     href += "Comments:%20";
  1141.     location.href = href;
  1142. }
  1143.  
  1144. /////////////////////////////////////////////////////////////////////////////
  1145. // Drop shadow functions
  1146. /////////////////////////////////////////////////////////////////////////////
  1147.  
  1148. function CreateDropShadow(e)
  1149. {
  1150.     if (false)
  1151.     {
  1152.         g_DropShadowRef = e;
  1153.  
  1154.         for (var i = g_DropShadowDepth; i > 0; i--)
  1155.         {
  1156.             var div = document.createElement("DIV");
  1157.             div.style.position = "absolute";
  1158.             div.style.left = (e.style.posLeft + i) + "px";
  1159.             div.style.top = (e.style.posTop + i) + "px";
  1160.             div.style.width = e.offsetWidth + "px";
  1161.             div.style.height = e.offsetHeight + "px";
  1162.             div.style.zIndex = e.style.zIndex - i;
  1163.             div.style.backgroundColor = g_DropShadowColor;
  1164.             div.style.filter = "alpha(opacity=" + ((1 - i / (i + 1)) * 50) + ")";
  1165.             e.insertAdjacentElement("afterEnd", div);
  1166.             g_DropShadows[g_DropShadows.length] = div;
  1167.         }
  1168.     }
  1169. }
  1170.  
  1171. function RemoveDropShadow()
  1172. {
  1173.     if (false)
  1174.     {
  1175.         for (var i = 0; i < g_DropShadows.length; i++)
  1176.             g_DropShadows[i].removeNode(true);
  1177.         g_DropShadows = new Array();
  1178.     }
  1179. }
  1180.  
  1181. /////////////////////////////////////////////////////////////////////////////
  1182. // Utility functions
  1183. /////////////////////////////////////////////////////////////////////////////
  1184.  
  1185. function GetNextSibling(e)
  1186. {
  1187.     return document.all(e.sourceIndex + e.children.length + 1);
  1188. }
  1189.  
  1190. function BeginsWith(s1, s2)
  1191. {
  1192.     return s1.toLowerCase().substring(0, s2.length) == s2.toLowerCase();
  1193. }
  1194.  
  1195. function IsArrayElement(array, element)
  1196. {
  1197.     for (var i = 0; i < array.length; i++)
  1198.     {
  1199.         if (array[i] == element)
  1200.             return true;
  1201.     }
  1202.     return false;
  1203. }
  1204.  
  1205. function isalnum(ch)
  1206. {
  1207.     return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_') || (ch == '-');
  1208. }
  1209.  
  1210.